package 小测试;


/**
 * Created by Administrator on 2017/9/16.
 */
public class MySingleton extends Thread { //基于静态内部类的特性，我们可以利用它的懒加载机制简化实现
    public static void main(String[] args) {
        MySingleton instance1 = getInstance();
        MySingleton instance2 = getInstance();
        System.out.println(instance1==instance2);
        System.out.println(instance1);
    }
    //高性能单例模式，实现方式1：
    //synchronized关键字修饰getInstance()方法，会导致所有调用getInstance()方法的线程都要竞争同一把锁，
    // 即使在单例对象已经生成好的情况下。这里使用double check的方式。另外，还需要注意instance在初始化过程中，
    // 可能已经不为NULL，这样有可能会导致程序崩溃，因此这里加了个临时变量t，确保初始化完成之后再赋值给instance。
    private static MySingleton instance = null;
    public static MySingleton getInstance2() {
        if (instance == null) {
            synchronized (MySingleton.class) {
                if (instance == null){
                    MySingleton t = new MySingleton();
                    instance = t;
                }
            }
        }
        return instance;
    }
    //单例模式实现方式2：
    //基于静态内部类的特性，我们可以利用它的懒加载机制简化实现java单例模式
    public static MySingleton getInstance(){
        return NestedClass.instance;
    }
   private static class NestedClass{
        private static MySingleton instance=new MySingleton(); //被类的所有对象共享
   }
}
